#ifndef ESTRATEGIA_MOVIMIENTO_FANTASMA_H
#define ESTRATEGIA_MOVIMIENTO_FANTASMA_H

#include "EstrategiaMovimiento.h"
#include "ObjetoVivo.h"
#include "Direccion.h"
#include "Punto.h"
#include "Lista.h"

class EstrategiaMovimientoFantasma : public EstrategiaMovimiento{

	protected:
		ObjetoVivo *presa;
        Punto* puntoPacman;
        unsigned int cantidadMovidas;
        Direccion* direccionActual;
		Direccion* direccionAnterior;

		bool existeEncrusijada(Punto* unPunto);

	public:

		EstrategiaMovimientoFantasma(ObjetoVivo *unaPresa, Direccion* unaDireccion, unsigned short velocidad);

		void setPresa(ObjetoVivo* unaPresa);

		ObjetoVivo* getPresa();

		Direccion* getDireccion();

		virtual void decidirNuevaDireccion(Punto* punto) = 0;

		// Actualiza los valores de direccion anterior y actual segun el pto actual y el siguiente.
		void actualizarDirecciones(Punto* antes, Punto* despues);

		// Dado un pto, devuelve de los 4 movimientos solo los posibles segun el sendero
		Lista<Punto>* getListaPuntosPosibles(Punto* punto);

		// Dado un punto me devuelve los posibles puntos, las 4 coordenadas
		Lista<Punto>* getListaPuntos(Punto* punto);

		// Dada una lista de posibles movimientos, el pto donde esta el fantasmay el punto donde esta el pacman, se retorna el pto mas cercano de la lista.
		Punto* calcularMasCercano(Lista<Punto>* lista, Punto* puntoActual, Punto* puntoPacman);

		virtual Punto* moverVirtual(Punto* unPunto);

		~EstrategiaMovimientoFantasma();
};
#endif